Data Overview

readr::read_csv(here("data/character_list5.csv"),
                      progress = FALSE,
                      col_types = cols(
                                    script_id = col_integer(),
                                    imdb_character_name = col_character(),
                                    words = col_integer(),
                                    gender = col_character(),
                                    age = col_character()
                                    )) %>%
  mutate(age = as.numeric(age)) -> characters_list
characters_list %>% 
  glimpse()
Observations: 23,048
Variables: 5
$ script_id           <int> 280, 280, 280, 280, 280, 280, 280, 623, 623, 623, 623, 623, 623...
$ imdb_character_name <chr> "betty", "carolyn johnson", "eleanor", "francesca johns", "madg...
$ words               <int> 311, 873, 138, 2251, 190, 723, 1908, 328, 409, 347, 2020, 366, ...
$ gender              <chr> "f", "f", "f", "f", "f", "m", "m", "m", "f", "m", "m", "m", "m"...
$ age                 <dbl> 35, NA, NA, 46, 46, 38, 65, NA, 28, NA, 58, 53, 25, 39, 33, NA,...
readr::read_csv(here("data/meta_data7.csv"),
                      progress = FALSE,
         col_types = cols(
                        script_id = col_integer(),
                        imdb_id = col_character(),
                        title = col_character(),
                        year = col_integer(),
                        gross = col_integer(),
                        lines_data = col_character()
                        )) %>%
  mutate(title = iconv(title,"latin1", "UTF-8")) -> meta_data
meta_data %>%
  glimpse()
Observations: 2,000
Variables: 6
$ script_id  <int> 1534, 1512, 1514, 1517, 1520, 6537, 3778, 623, 1525, 6030, 625, 1509, 85...
$ imdb_id    <chr> "tt1022603", "tt0147800", "tt0417385", "tt2024544", "tt1542344", "tt0450...
$ title      <chr> "(500) Days of Summer", "10 Things I Hate About You", "12 and Holding", ...
$ year       <int> 2009, 1999, 2005, 2013, 2010, 2007, 1992, 2001, 2009, 2013, 1968, 2009, ...
$ gross      <int> 37, 65, NA, 60, 20, 91, 15, 37, 74, 80, 376, 192, 98, 204, 19, 59, 67, 3...
$ lines_data <chr> "74354452567747744433425777756577444344445644567454336755345277773423754...

Combinando Dados Originais

left_join(characters_list, 
          meta_data, 
          by=c("script_id")) %>%
  group_by(title, year) %>%
  drop_na(gross) %>%
  ungroup() -> scripts_data
scripts_data %>%
  glimpse()
Observations: 19,387
Variables: 10
$ script_id           <int> 280, 280, 280, 280, 280, 280, 280, 623, 623, 623, 623, 623, 623...
$ imdb_character_name <chr> "betty", "carolyn johnson", "eleanor", "francesca johns", "madg...
$ words               <int> 311, 873, 138, 2251, 190, 723, 1908, 328, 409, 347, 2020, 366, ...
$ gender              <chr> "f", "f", "f", "f", "f", "m", "m", "m", "f", "m", "m", "m", "m"...
$ age                 <dbl> 35, NA, NA, 46, 46, 38, 65, NA, 28, NA, 58, 53, 25, 39, 33, NA,...
$ imdb_id             <chr> "tt0112579", "tt0112579", "tt0112579", "tt0112579", "tt0112579"...
$ title               <chr> "The Bridges of Madison County", "The Bridges of Madison County...
$ year                <int> 1995, 1995, 1995, 1995, 1995, 1995, 1995, 2001, 2001, 2001, 200...
$ gross               <int> 142, 142, 142, 142, 142, 142, 142, 37, 37, 37, 37, 37, 37, 37, ...
$ lines_data          <chr> "43320234343434432034334343344334343434344343443443334344434443...

Words

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x=words,
             y=(..count..)/sum(..count..))) +
  geom_histogram(binwidth = 250,
                 boundary = 0,
                 fill = "grey",
                 color = "black")

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x="", 
             y=words)) +
  geom_violin(fill="grey",
               width=0.5)

Female Proportion

scripts_data %>%
  group_by(title, year) %>%
  mutate(fem_prop = (sum(gender == "f") / n()),
         man_prop = (1 - fem_prop)) %>% 
  ungroup() -> scripts_data
scripts_data %>%
  select(title,
         year,
         fem_prop,
         man_prop) %>%
  sample_n(10)
scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x=fem_prop,
             y=(..count..)/sum(..count..))) +
  geom_histogram(binwidth = 0.05,
                 boundary = 0,
                 fill = "grey",
                 color = "black")

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x="", 
             y=fem_prop)) +
  geom_violin(fill="grey",
               width=0.5)

Movie Year

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x=year)) +
  geom_bar(fill = "grey",
           color = "black")

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  ggplot(aes(x="", 
             y=year)) +
  geom_violin(fill="grey",
               width=0.5)

scripts_data %>%
  mutate(fem_words = ifelse(gender == "f",words,0),
         man_words = ifelse(gender == "m",words,0)) %>%
  group_by(title, year) %>%
  mutate(mean_fem_words = ifelse(sum(gender == "f") == 0, 0, sum(fem_words)/sum(gender == "f")),
         mean_man_words = ifelse(sum(gender == "m") == 0, 0, sum(man_words)/sum(gender == "m"))) %>% 
  ungroup()  -> scripts_data
scripts_data %>%
  select(title,
         year,
         mean_fem_words,
         mean_man_words) %>%
  sample_n(10)
scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  filter(!mean_fem_words == 0) %>%
  ggplot(aes(x=mean_fem_words,
             y=(..count..)/sum(..count..))) +
  geom_histogram(binwidth = 250,
                 boundary = 0,
                 fill = "grey",
                 color = "black")

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  filter(!mean_fem_words == 0) %>%
  ggplot(aes(x="", 
             y=mean_fem_words)) +
  geom_violin(fill="grey",
               width=0.5)

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  filter(!mean_man_words == 0) %>%
  ggplot(aes(x=mean_man_words,
             y=(..count..)/sum(..count..))) +
  geom_histogram(binwidth = 250,
                 boundary = 0,
                 fill = "grey",
                 color = "black")

scripts_data %>%
  group_by(title,year) %>%
  unique() %>%
  filter(!mean_man_words == 0) %>%
  ggplot(aes(x="", 
             y=mean_man_words)) +
  geom_violin(fill="grey",
               width=0.5)

Scale Data

scripts_data %>%
  group_by(title) %>%
  slice(1) %>%
  unique() %>%
  ungroup() %>%
  select(title,
         year,
         gross,
         fem_prop,
         mean_fem_words,
         mean_man_words) -> data
select(data, -title) %>%
mutate_all(funs(scale)) -> scaled_data
scaled_data %>% 
  sample_n(10)

Número K ótimo

GAP statistic

A GAP compara a solução do agrupamento com cada k com a solução em um dataset onde não há estrutura de grupos.

plot_clusgap = function(clusgap, title="Gap Statistic calculation results"){
    require("ggplot2")
    gstab = data.frame(clusgap$Tab, k=1:nrow(clusgap$Tab))
    p = ggplot(gstab, aes(k, gap)) + geom_line() + geom_point(size=5)
    p = p + geom_errorbar(aes(ymax=gap+SE.sim, ymin=gap-SE.sim), width = .2)
    p = p + ggtitle(title)
    return(p)
}
gaps <- scaled_data %>% 
    clusGap(FUN = kmeans,
            nstart = 20,
            K.max = 8,
            B = 200,
            iter.max=30)
Clustering k = 1,2,..., K.max (= 8): .. done
Bootstrapping, b = 1,2,..., B (= 200)  [one "." per sample]:
.................................................. 50 
.................................................. 100 
.................................................. 150 
.................................................. 200 
plot_clusgap(gaps)

Elbow Method

set.seed(123)
# Compute and plot wss for k = 2 to k = 15.
k.max <- 15
wss <- sapply(1:k.max, 
              function(k){kmeans(scaled_data, k, nstart=50,iter.max = 15 )$tot.withinss})
plot(1:k.max, wss,
     type="b", pch = 19, frame = FALSE, 
     xlab="Number of clusters K",
     ylab="Total within-clusters sum of squares")

  • Pelo Elbow method 4 ou 3 parece ser um bom número de grupos.

Silhouette

data(varespec)
dis = dist(scaled_data)^2
res = kmeans(scaled_data,3)
sil = silhouette (res$cluster, dis)
plot(sil)

Bayesian Information Criterion

fitting ...

  |                                                                                            
  |                                                                                      |   0%
  |                                                                                            
  |=                                                                                     |   1%
  |                                                                                            
  |==                                                                                    |   2%
  |                                                                                            
  |==                                                                                    |   3%
  |                                                                                            
  |===                                                                                   |   3%
  |                                                                                            
  |===                                                                                   |   4%
  |                                                                                            
  |====                                                                                  |   4%
  |                                                                                            
  |====                                                                                  |   5%
  |                                                                                            
  |=====                                                                                 |   6%
  |                                                                                            
  |======                                                                                |   7%
  |                                                                                            
  |=======                                                                               |   8%
  |                                                                                            
  |=======                                                                               |   9%
  |                                                                                            
  |========                                                                              |   9%
  |                                                                                            
  |=========                                                                             |  10%
  |                                                                                            
  |=========                                                                             |  11%
  |                                                                                            
  |==========                                                                            |  11%
  |                                                                                            
  |==========                                                                            |  12%
  |                                                                                            
  |===========                                                                           |  12%
  |                                                                                            
  |===========                                                                           |  13%
  |                                                                                            
  |============                                                                          |  14%
  |                                                                                            
  |=============                                                                         |  15%
  |                                                                                            
  |=============                                                                         |  16%
  |                                                                                            
  |==============                                                                        |  16%
  |                                                                                            
  |==============                                                                        |  17%
  |                                                                                            
  |===============                                                                       |  17%
  |                                                                                            
  |===============                                                                       |  18%
  |                                                                                            
  |================                                                                      |  18%
  |                                                                                            
  |================                                                                      |  19%
  |                                                                                            
  |=================                                                                     |  19%
  |                                                                                            
  |=================                                                                     |  20%
  |                                                                                            
  |==================                                                                    |  20%
  |                                                                                            
  |==================                                                                    |  21%
  |                                                                                            
  |===================                                                                   |  22%
  |                                                                                            
  |====================                                                                  |  23%
  |                                                                                            
  |====================                                                                  |  24%
  |                                                                                            
  |=====================                                                                 |  24%
  |                                                                                            
  |=====================                                                                 |  25%
  |                                                                                            
  |======================                                                                |  25%
  |                                                                                            
  |======================                                                                |  26%
  |                                                                                            
  |=======================                                                               |  27%
  |                                                                                            
  |========================                                                              |  27%
  |                                                                                            
  |========================                                                              |  28%
  |                                                                                            
  |=========================                                                             |  29%
  |                                                                                            
  |==========================                                                            |  30%
  |                                                                                            
  |==========================                                                            |  31%
  |                                                                                            
  |===========================                                                           |  31%
  |                                                                                            
  |===========================                                                           |  32%
  |                                                                                            
  |============================                                                          |  32%
  |                                                                                            
  |============================                                                          |  33%
  |                                                                                            
  |=============================                                                         |  33%
  |                                                                                            
  |=============================                                                         |  34%
  |                                                                                            
  |==============================                                                        |  35%
  |                                                                                            
  |===============================                                                       |  36%
  |                                                                                            
  |================================                                                      |  37%
  |                                                                                            
  |=================================                                                     |  38%
  |                                                                                            
  |=================================                                                     |  39%
  |                                                                                            
  |==================================                                                    |  39%
  |                                                                                            
  |==================================                                                    |  40%
  |                                                                                            
  |===================================                                                   |  40%
  |                                                                                            
  |===================================                                                   |  41%
  |                                                                                            
  |====================================                                                  |  42%
  |                                                                                            
  |=====================================                                                 |  43%
  |                                                                                            
  |=====================================                                                 |  44%
  |                                                                                            
  |======================================                                                |  44%
  |                                                                                            
  |======================================                                                |  45%
  |                                                                                            
  |=======================================                                               |  45%
  |                                                                                            
  |========================================                                              |  46%
  |                                                                                            
  |========================================                                              |  47%
  |                                                                                            
  |=========================================                                             |  47%
  |                                                                                            
  |=========================================                                             |  48%
  |                                                                                            
  |==========================================                                            |  48%
  |                                                                                            
  |==========================================                                            |  49%
  |                                                                                            
  |===========================================                                           |  50%
  |                                                                                            
  |============================================                                          |  51%
  |                                                                                            
  |============================================                                          |  52%
  |                                                                                            
  |=============================================                                         |  52%
  |                                                                                            
  |=============================================                                         |  53%
  |                                                                                            
  |==============================================                                        |  53%
  |                                                                                            
  |==============================================                                        |  54%
  |                                                                                            
  |===============================================                                       |  55%
  |                                                                                            
  |================================================                                      |  55%
  |                                                                                            
  |================================================                                      |  56%
  |                                                                                            
  |=================================================                                     |  56%
  |                                                                                            
  |=================================================                                     |  57%
  |                                                                                            
  |==================================================                                    |  58%
  |                                                                                            
  |===================================================                                   |  59%
  |                                                                                            
  |===================================================                                   |  60%
  |                                                                                            
  |====================================================                                  |  60%
  |                                                                                            
  |====================================================                                  |  61%
  |                                                                                            
  |=====================================================                                 |  61%
  |                                                                                            
  |=====================================================                                 |  62%
  |                                                                                            
  |======================================================                                |  63%
  |                                                                                            
  |=======================================================                               |  64%
  |                                                                                            
  |========================================================                              |  65%
  |                                                                                            
  |=========================================================                             |  66%
  |                                                                                            
  |=========================================================                             |  67%
  |                                                                                            
  |==========================================================                            |  67%
  |                                                                                            
  |==========================================================                            |  68%
  |                                                                                            
  |===========================================================                           |  68%
  |                                                                                            
  |===========================================================                           |  69%
  |                                                                                            
  |============================================================                          |  69%
  |                                                                                            
  |============================================================                          |  70%
  |                                                                                            
  |=============================================================                         |  71%
  |                                                                                            
  |==============================================================                        |  72%
  |                                                                                            
  |==============================================================                        |  73%
  |                                                                                            
  |===============================================================                       |  73%
  |                                                                                            
  |================================================================                      |  74%
  |                                                                                            
  |================================================================                      |  75%
  |                                                                                            
  |=================================================================                     |  75%
  |                                                                                            
  |=================================================================                     |  76%
  |                                                                                            
  |==================================================================                    |  76%
  |                                                                                            
  |==================================================================                    |  77%
  |                                                                                            
  |===================================================================                   |  78%
  |                                                                                            
  |====================================================================                  |  79%
  |                                                                                            
  |====================================================================                  |  80%
  |                                                                                            
  |=====================================================================                 |  80%
  |                                                                                            
  |=====================================================================                 |  81%
  |                                                                                            
  |======================================================================                |  81%
  |                                                                                            
  |======================================================================                |  82%
  |                                                                                            
  |=======================================================================               |  82%
  |                                                                                            
  |=======================================================================               |  83%
  |                                                                                            
  |========================================================================              |  83%
  |                                                                                            
  |========================================================================              |  84%
  |                                                                                            
  |=========================================================================             |  84%
  |                                                                                            
  |=========================================================================             |  85%
  |                                                                                            
  |==========================================================================            |  86%
  |                                                                                            
  |===========================================================================           |  87%
  |                                                                                            
  |===========================================================================           |  88%
  |                                                                                            
  |============================================================================          |  88%
  |                                                                                            
  |============================================================================          |  89%
  |                                                                                            
  |=============================================================================         |  89%
  |                                                                                            
  |=============================================================================         |  90%
  |                                                                                            
  |==============================================================================        |  91%
  |                                                                                            
  |===============================================================================       |  91%
  |                                                                                            
  |===============================================================================       |  92%
  |                                                                                            
  |================================================================================      |  93%
  |                                                                                            
  |=================================================================================     |  94%
  |                                                                                            
  |==================================================================================    |  95%
  |                                                                                            
  |==================================================================================    |  96%
  |                                                                                            
  |===================================================================================   |  96%
  |                                                                                            
  |===================================================================================   |  97%
  |                                                                                            
  |====================================================================================  |  97%
  |                                                                                            
  |====================================================================================  |  98%
  |                                                                                            
  |===================================================================================== |  99%
  |                                                                                            
  |======================================================================================| 100%
Bayesian Information Criterion (BIC): 
         EII       VII       EEI       VEI       EVI       VVI       EEE       EVE       VEE
1  -23579.67 -23579.67 -23609.33 -23609.33 -23609.33 -23609.33 -23225.17 -23225.17 -23225.17
2  -23003.06 -21804.34 -22817.07 -21478.61 -21697.14 -21003.77 -22612.74 -22177.55 -21270.14
3  -22333.06 -21499.75 -22050.19 -21180.85 -20945.48 -20246.23 -21954.22 -20896.38 -21029.00
4  -22199.58 -21013.42 -22009.32 -20786.64 -20431.48 -19889.96 -21911.79 -20369.67 -20606.10
5  -22077.64 -20741.44 -22053.58 -20606.76 -20260.04 -19533.57 -21856.56 -20218.54 -20453.28
6  -21656.44 -20592.06 -21247.73 -20333.25 -20030.88 -19240.93 -21466.36 -20076.60 -20290.03
7  -21417.12 -20516.17 -21088.10 -20229.80 -19955.50 -19227.16 -21360.52 -19927.95 -20190.00
8  -21317.61 -20460.35 -21056.62 -20082.06 -19901.24 -19202.16 -21405.05 -19975.12 -20099.36
9  -21307.44 -20342.06 -20774.10 -19960.91 -19839.67 -19201.85 -21451.38 -19752.71 -20078.18
10 -21080.55 -20239.96 -20795.92 -19935.03 -19804.49 -19151.79 -21092.48 -19734.68 -19928.18
11 -21078.17 -20232.61 -20887.50 -19951.73 -19743.12 -19172.48 -21130.63 -19710.75 -19939.65
12 -20994.56 -20232.40 -20918.43 -19959.96 -19816.31 -19185.72 -20895.85        NA -19943.95
13 -21038.34 -20220.85 -20962.83 -19974.57 -19806.74 -19207.07 -20940.36 -19742.23 -19955.80
14 -21081.78 -20222.26 -21007.03 -19933.00 -19758.87 -19181.25 -20983.11 -19820.39 -19901.33
15 -21099.73 -20182.05 -20858.12 -19960.05 -19780.73        NA -20930.24 -19642.84 -19918.94
         VVE       EEV       VEV       EVV       VVV
1  -23225.17 -23225.17 -23225.17 -23225.17 -23225.17
2  -21089.81 -21784.65 -20718.89 -21896.66 -20688.97
3  -20558.99 -21170.21 -20388.35 -20838.19 -20094.89
4  -20233.69 -21135.54 -20100.22 -20610.94 -19885.04
5  -20166.72 -20549.56 -19929.24 -20307.86 -19624.60
6  -19999.78 -20493.46 -19718.33 -20156.43 -19540.47
7  -20031.88 -20452.91 -19744.75 -20161.84 -19544.93
8  -19936.39 -20408.82 -19641.23 -20168.39 -19518.19
9  -19516.33 -20236.97 -19651.90 -20173.69 -19519.13
10        NA -20217.81 -19655.67 -20208.62 -19577.38
11        NA -20315.81 -19683.64 -20226.75 -19654.89
12 -19192.63 -20240.98 -19756.07 -20295.14        NA
13 -19155.69 -20358.12 -19783.59 -20230.65 -19763.31
14 -19271.62 -20230.29 -19765.60 -20266.80 -19852.96
15 -19198.36 -20372.79 -19849.51 -20351.47 -19925.35

Top 3 models based on the BIC criterion: 
   VVI,10    VVE,13    VVI,11 
-19151.79 -19155.69 -19172.48 
  • O Bayesian Information Criterion nos sugere K= {9,8,7} como melhores soluções
plot(d_clust$BIC)

  • Visualmente K= 3 e K = 4 representam o ganho mais significativo em termos de BIC (Bayesian Information Criterion)

Hubert Index e D Index

nb <- NbClust(scaled_data, diss=NULL, distance = "euclidean", 
              min.nc=2, max.nc=5, method = "kmeans", 
              index = "all", alphaBeale = 0.1)
*** : The Hubert index is a graphical method of determining the number of clusters.
                In the plot of Hubert index, we seek a significant knee that corresponds to a 
                significant increase of the value of the measure i.e the significant peak in Hubert
                index second differences plot. 
 

*** : The D index is a graphical method of determining the number of clusters. 
                In the plot of D index, we seek a significant knee (the significant peak in Dindex
                second differences plot) that corresponds to a significant increase of the value of
                the measure. 
 
******************************************************************* 
* Among all indices:                                                
* 7 proposed 2 as the best number of clusters 
* 9 proposed 3 as the best number of clusters 
* 3 proposed 4 as the best number of clusters 
* 5 proposed 5 as the best number of clusters 

                   ***** Conclusion *****                            
 
* According to the majority rule, the best number of clusters is  3 
 
 
******************************************************************* 

hist(nb$Best.nc[1,], breaks = max(na.omit(nb$Best.nc[1,])))

  • O índice de Hubert e o índice D sugerem K = 3 como a melhor solução

Trivia

# toclust = x %>% 
#     rownames_to_column(var = "language") %>% 
#     select(1:5) 
# dists = toclust %>% 
#     select(-language) %>% 
#     dist() # só para plotar silhouetas depois
# km = toclust %>% 
#     select(-language) %>% 
#     kmeans(centers = n_clusters, nstart = 20)
# km %>% 
#     augment(toclust) %>% 
#     gather(key = "variável", value = "valor", -language, -.cluster) %>% 
#     ggplot(aes(x = `variável`, y = valor, group = language, colour = .cluster)) + 
#     geom_point(alpha = 0.2) + 
#     geom_line(alpha = .5) + 
#     facet_wrap(~ .cluster) 
library(GGally)

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
data(crabs, package = "MASS")
ggparcoord(crabs, columns = 4:8, groupColumn = "sp")

library(GGally)
ggparcoord(scaled_data)

library(lattice)
parallelplot(scaled_data)

scaled_data %>%
    kmeans(3, nstart=100) -> km
p <- autoplot(km, data=scaled_data, frame = TRUE)  
ggplotly(p)
n_clusters = 3
row.names(scaled_data) <- data$title
Setting row names on a tibble is deprecated.
toclust <- scaled_data %>% 
    rownames_to_column(var = "title") 
km = toclust %>% 
    select(-title) %>% 
    kmeans(centers = n_clusters, nstart = 20)
km %>% 
    augment(toclust) %>% 
    gather(key = "variável", value = "valor", -title, -.cluster) %>% 
    ggplot(aes(x = `variável`, y = valor, group = title, colour = .cluster)) + 
    geom_point(alpha = 0.2) + 
    geom_line(alpha = .5) + 
    facet_wrap(~ .cluster) +
    coord_flip()
attributes are not identical across measure variables;
they will be dropped

LS0tCnRpdGxlOiAiTGluZSBkaXN0cmlidXRpb24gb24gY2luZW1hIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCgpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmxpYnJhcnkoaGVyZSkKbGlicmFyeShicm9vbSkKbGlicmFyeSh2ZWdhbikKbGlicmFyeShtY2x1c3QpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KE5iQ2x1c3QpCmxpYnJhcnkobGF0dGljZSkKbGlicmFyeShjbHVzdGVyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ2ZvcnRpZnkpCgp0aGVtZV9zZXQodGhlbWVfYncoKSkKYGBgCgojIERhdGEgT3ZlcnZpZXcKCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpyZWFkcjo6cmVhZF9jc3YoaGVyZSgiZGF0YS9jaGFyYWN0ZXJfbGlzdDUuY3N2IiksCiAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X2lkID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1kYl9jaGFyYWN0ZXJfbmFtZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHMgPSBjb2xfaW50ZWdlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5kZXIgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZSA9IGNvbF9jaGFyYWN0ZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhZ2UpKSAtPiBjaGFyYWN0ZXJzX2xpc3QKCmNoYXJhY3RlcnNfbGlzdCAlPiUgCiAgZ2xpbXBzZSgpCgpgYGAKCmBgYHtyfQpyZWFkcjo6cmVhZF9jc3YoaGVyZSgiZGF0YS9tZXRhX2RhdGE3LmNzdiIpLAogICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSBGQUxTRSwKICAgICAgICAgY29sX3R5cGVzID0gY29scygKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X2lkID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgaW1kYl9pZCA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSBjb2xfaW50ZWdlcigpLAogICAgICAgICAgICAgICAgICAgICAgICBncm9zcyA9IGNvbF9pbnRlZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzX2RhdGEgPSBjb2xfY2hhcmFjdGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgbXV0YXRlKHRpdGxlID0gaWNvbnYodGl0bGUsImxhdGluMSIsICJVVEYtOCIpKSAtPiBtZXRhX2RhdGEKCm1ldGFfZGF0YSAlPiUKICBnbGltcHNlKCkKCmBgYAoKIyMjIyBDb21iaW5hbmRvIERhZG9zIE9yaWdpbmFpcwoKYGBge3J9CmxlZnRfam9pbihjaGFyYWN0ZXJzX2xpc3QsIAogICAgICAgICAgbWV0YV9kYXRhLCAKICAgICAgICAgIGJ5PWMoInNjcmlwdF9pZCIpKSAlPiUKICBncm91cF9ieSh0aXRsZSwgeWVhcikgJT4lCiAgZHJvcF9uYShncm9zcykgJT4lCiAgdW5ncm91cCgpIC0+IHNjcmlwdHNfZGF0YQoKc2NyaXB0c19kYXRhICU+JQogIGdsaW1wc2UoKQpgYGAKCiMjIFdvcmRzCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIGdyb3VwX2J5KHRpdGxlLHllYXIpICU+JQogIHVuaXF1ZSgpICU+JQogIGdncGxvdChhZXMoeD13b3JkcywKICAgICAgICAgICAgIHk9KC4uY291bnQuLikvc3VtKC4uY291bnQuLikpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyNTAsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JleSIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKQpgYGAKCmBgYHtyfQpzY3JpcHRzX2RhdGEgJT4lCiAgZ3JvdXBfYnkodGl0bGUseWVhcikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZ2dwbG90KGFlcyh4PSIiLCAKICAgICAgICAgICAgIHk9d29yZHMpKSArCiAgZ2VvbV92aW9saW4oZmlsbD0iZ3JleSIsCiAgICAgICAgICAgICAgIHdpZHRoPTAuNSkKYGBgCgoKIyMgRmVtYWxlIFByb3BvcnRpb24gCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIGdyb3VwX2J5KHRpdGxlLCB5ZWFyKSAlPiUKICBtdXRhdGUoZmVtX3Byb3AgPSAoc3VtKGdlbmRlciA9PSAiZiIpIC8gbigpKSwKICAgICAgICAgbWFuX3Byb3AgPSAoMSAtIGZlbV9wcm9wKSkgJT4lIAogIHVuZ3JvdXAoKSAtPiBzY3JpcHRzX2RhdGEKCnNjcmlwdHNfZGF0YSAlPiUKICBzZWxlY3QodGl0bGUsCiAgICAgICAgIHllYXIsCiAgICAgICAgIGZlbV9wcm9wLAogICAgICAgICBtYW5fcHJvcCkgJT4lCiAgc2FtcGxlX24oMTApCmBgYAoKCmBgYHtyfQpzY3JpcHRzX2RhdGEgJT4lCiAgZ3JvdXBfYnkodGl0bGUseWVhcikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZ2dwbG90KGFlcyh4PWZlbV9wcm9wLAogICAgICAgICAgICAgeT0oLi5jb3VudC4uKS9zdW0oLi5jb3VudC4uKSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMDUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JleSIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKQpgYGAKCmBgYHtyfQpzY3JpcHRzX2RhdGEgJT4lCiAgZ3JvdXBfYnkodGl0bGUseWVhcikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZ2dwbG90KGFlcyh4PSIiLCAKICAgICAgICAgICAgIHk9ZmVtX3Byb3ApKSArCiAgZ2VvbV92aW9saW4oZmlsbD0iZ3JleSIsCiAgICAgICAgICAgICAgIHdpZHRoPTAuNSkKYGBgCgojIyBNb3ZpZSBZZWFyIAoKYGBge3J9CnNjcmlwdHNfZGF0YSAlPiUKICBncm91cF9ieSh0aXRsZSx5ZWFyKSAlPiUKICB1bmlxdWUoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcikpICsKICBnZW9tX2JhcihmaWxsID0gImdyZXkiLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKYGBgCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIGdyb3VwX2J5KHRpdGxlLHllYXIpICU+JQogIHVuaXF1ZSgpICU+JQogIGdncGxvdChhZXMoeD0iIiwgCiAgICAgICAgICAgICB5PXllYXIpKSArCiAgZ2VvbV92aW9saW4oZmlsbD0iZ3JleSIsCiAgICAgICAgICAgICAgIHdpZHRoPTAuNSkKYGBgCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIG11dGF0ZShmZW1fd29yZHMgPSBpZmVsc2UoZ2VuZGVyID09ICJmIix3b3JkcywwKSwKICAgICAgICAgbWFuX3dvcmRzID0gaWZlbHNlKGdlbmRlciA9PSAibSIsd29yZHMsMCkpICU+JQogIGdyb3VwX2J5KHRpdGxlLCB5ZWFyKSAlPiUKICBtdXRhdGUobWVhbl9mZW1fd29yZHMgPSBpZmVsc2Uoc3VtKGdlbmRlciA9PSAiZiIpID09IDAsIDAsIHN1bShmZW1fd29yZHMpL3N1bShnZW5kZXIgPT0gImYiKSksCiAgICAgICAgIG1lYW5fbWFuX3dvcmRzID0gaWZlbHNlKHN1bShnZW5kZXIgPT0gIm0iKSA9PSAwLCAwLCBzdW0obWFuX3dvcmRzKS9zdW0oZ2VuZGVyID09ICJtIikpKSAlPiUgCiAgdW5ncm91cCgpICAtPiBzY3JpcHRzX2RhdGEKCnNjcmlwdHNfZGF0YSAlPiUKICBzZWxlY3QodGl0bGUsCiAgICAgICAgIHllYXIsCiAgICAgICAgIG1lYW5fZmVtX3dvcmRzLAogICAgICAgICBtZWFuX21hbl93b3JkcykgJT4lCiAgc2FtcGxlX24oMTApCmBgYAoKYGBge3J9CnNjcmlwdHNfZGF0YSAlPiUKICBncm91cF9ieSh0aXRsZSx5ZWFyKSAlPiUKICB1bmlxdWUoKSAlPiUKICBmaWx0ZXIoIW1lYW5fZmVtX3dvcmRzID09IDApICU+JQogIGdncGxvdChhZXMoeD1tZWFuX2ZlbV93b3JkcywKICAgICAgICAgICAgIHk9KC4uY291bnQuLikvc3VtKC4uY291bnQuLikpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyNTAsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGZpbGwgPSAiZ3JleSIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKQpgYGAKCmBgYHtyfQpzY3JpcHRzX2RhdGEgJT4lCiAgZ3JvdXBfYnkodGl0bGUseWVhcikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZmlsdGVyKCFtZWFuX2ZlbV93b3JkcyA9PSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9IiIsIAogICAgICAgICAgICAgeT1tZWFuX2ZlbV93b3JkcykpICsKICBnZW9tX3Zpb2xpbihmaWxsPSJncmV5IiwKICAgICAgICAgICAgICAgd2lkdGg9MC41KQpgYGAKCmBgYHtyfQpzY3JpcHRzX2RhdGEgJT4lCiAgZ3JvdXBfYnkodGl0bGUseWVhcikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZmlsdGVyKCFtZWFuX21hbl93b3JkcyA9PSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bWVhbl9tYW5fd29yZHMsCiAgICAgICAgICAgICB5PSguLmNvdW50Li4pL3N1bSguLmNvdW50Li4pKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMjUwLAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBmaWxsID0gImdyZXkiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKYGBgCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIGdyb3VwX2J5KHRpdGxlLHllYXIpICU+JQogIHVuaXF1ZSgpICU+JQogIGZpbHRlcighbWVhbl9tYW5fd29yZHMgPT0gMCkgJT4lCiAgZ2dwbG90KGFlcyh4PSIiLCAKICAgICAgICAgICAgIHk9bWVhbl9tYW5fd29yZHMpKSArCiAgZ2VvbV92aW9saW4oZmlsbD0iZ3JleSIsCiAgICAgICAgICAgICAgIHdpZHRoPTAuNSkKYGBgCgojIyBTY2FsZSBEYXRhCgpgYGB7cn0Kc2NyaXB0c19kYXRhICU+JQogIGdyb3VwX2J5KHRpdGxlKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmlxdWUoKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KHRpdGxlLAogICAgICAgICB5ZWFyLAogICAgICAgICBncm9zcywKICAgICAgICAgZmVtX3Byb3AsCiAgICAgICAgIG1lYW5fZmVtX3dvcmRzLAogICAgICAgICBtZWFuX21hbl93b3JkcykgLT4gZGF0YQoKc2VsZWN0KGRhdGEsIC10aXRsZSkgJT4lCm11dGF0ZV9hbGwoZnVucyhzY2FsZSkpIC0+IHNjYWxlZF9kYXRhCgpzY2FsZWRfZGF0YSAlPiUgCiAgc2FtcGxlX24oMTApCmBgYAoKIyAgTsO6bWVybyBLIMOzdGltbyAKCiMjIEdBUCBzdGF0aXN0aWMKCkEgR0FQIGNvbXBhcmEgYSBzb2x1w6fDo28gZG8gYWdydXBhbWVudG8gY29tIGNhZGEgayBjb20gYSBzb2x1w6fDo28gZW0gdW0gZGF0YXNldCBvbmRlIG7Do28gaMOhIGVzdHJ1dHVyYSBkZSBncnVwb3MuIAoKYGBge3J9CnBsb3RfY2x1c2dhcCA9IGZ1bmN0aW9uKGNsdXNnYXAsIHRpdGxlPSJHYXAgU3RhdGlzdGljIGNhbGN1bGF0aW9uIHJlc3VsdHMiKXsKICAgIHJlcXVpcmUoImdncGxvdDIiKQogICAgZ3N0YWIgPSBkYXRhLmZyYW1lKGNsdXNnYXAkVGFiLCBrPTE6bnJvdyhjbHVzZ2FwJFRhYikpCiAgICBwID0gZ2dwbG90KGdzdGFiLCBhZXMoaywgZ2FwKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoc2l6ZT01KQogICAgcCA9IHAgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PWdhcCtTRS5zaW0sIHltaW49Z2FwLVNFLnNpbSksIHdpZHRoID0gLjIpCiAgICBwID0gcCArIGdndGl0bGUodGl0bGUpCiAgICByZXR1cm4ocCkKfQpgYGAKCmBgYHtyfQpnYXBzIDwtIHNjYWxlZF9kYXRhICU+JSAKICAgIGNsdXNHYXAoRlVOID0ga21lYW5zLAogICAgICAgICAgICBuc3RhcnQgPSAyMCwKICAgICAgICAgICAgSy5tYXggPSA4LAogICAgICAgICAgICBCID0gMjAwLAogICAgICAgICAgICBpdGVyLm1heD0zMCkKYGBgCgpgYGB7cn0KcGxvdF9jbHVzZ2FwKGdhcHMpCmBgYAoKIyMgRWxib3cgTWV0aG9kCgpgYGB7cn0Kc2V0LnNlZWQoMTIzKQojIENvbXB1dGUgYW5kIHBsb3Qgd3NzIGZvciBrID0gMiB0byBrID0gMTUuCmsubWF4IDwtIDE1Cgp3c3MgPC0gc2FwcGx5KDE6ay5tYXgsIAogICAgICAgICAgICAgIGZ1bmN0aW9uKGspe2ttZWFucyhzY2FsZWRfZGF0YSwgaywgbnN0YXJ0PTUwLGl0ZXIubWF4ID0gMTUgKSR0b3Qud2l0aGluc3N9KQpwbG90KDE6ay5tYXgsIHdzcywKICAgICB0eXBlPSJiIiwgcGNoID0gMTksIGZyYW1lID0gRkFMU0UsIAogICAgIHhsYWI9Ik51bWJlciBvZiBjbHVzdGVycyBLIiwKICAgICB5bGFiPSJUb3RhbCB3aXRoaW4tY2x1c3RlcnMgc3VtIG9mIHNxdWFyZXMiKQpgYGAKCiogUGVsbyBFbGJvdyBtZXRob2QgNCBvdSAzIHBhcmVjZSBzZXIgdW0gYm9tIG7Dum1lcm8gZGUgZ3J1cG9zLgoKIyMgU2lsaG91ZXR0ZQoKYGBge3J9CmRhdGEodmFyZXNwZWMpCmRpcyA9IGRpc3Qoc2NhbGVkX2RhdGEpXjIKcmVzID0ga21lYW5zKHNjYWxlZF9kYXRhLDMpCnNpbCA9IHNpbGhvdWV0dGUgKHJlcyRjbHVzdGVyLCBkaXMpCnBsb3Qoc2lsKQpgYGAKCiMjIEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZF9jbHVzdCA8LSBNY2x1c3QoYXMubWF0cml4KHNjYWxlZF9kYXRhKSwgRz0xOjE1LCAKICAgICAgICAgICAgICAgICAgbW9kZWxOYW1lcyA9IG1jbHVzdC5vcHRpb25zKCJlbU1vZGVsTmFtZXMiKSkKZF9jbHVzdCRCSUMKYGBgCgoqIE8gQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIG5vcyBzdWdlcmUgSz0gezksOCw3fSBjb21vIG1lbGhvcmVzIHNvbHXDp8O1ZXMKCmBgYHtyfQpwbG90KGRfY2x1c3QkQklDKQpgYGAKCiogVmlzdWFsbWVudGUgSz0gMyBlIEsgPSA0IHJlcHJlc2VudGFtIG8gZ2FuaG8gbWFpcyBzaWduaWZpY2F0aXZvIGVtIHRlcm1vcyBkZSBCSUMgKEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbikgCgojIyBIdWJlcnQgSW5kZXggZSBEIEluZGV4CgpgYGB7cn0KbmIgPC0gTmJDbHVzdChzY2FsZWRfZGF0YSwgZGlzcz1OVUxMLCBkaXN0YW5jZSA9ICJldWNsaWRlYW4iLCAKICAgICAgICAgICAgICBtaW4ubmM9MiwgbWF4Lm5jPTUsIG1ldGhvZCA9ICJrbWVhbnMiLCAKICAgICAgICAgICAgICBpbmRleCA9ICJhbGwiLCBhbHBoYUJlYWxlID0gMC4xKQpoaXN0KG5iJEJlc3QubmNbMSxdLCBicmVha3MgPSBtYXgobmEub21pdChuYiRCZXN0Lm5jWzEsXSkpKQpgYGAKCiogTyDDrW5kaWNlIGRlIEh1YmVydCBlIG8gw61uZGljZSBEIHN1Z2VyZW0gSyA9IDMgIGNvbW8gYSBtZWxob3Igc29sdcOnw6NvCgojIFRyaXZpYQoKYGBge3J9CiMgdG9jbHVzdCA9IHggJT4lIAojICAgICByb3duYW1lc190b19jb2x1bW4odmFyID0gImxhbmd1YWdlIikgJT4lIAojICAgICBzZWxlY3QoMTo1KSAKIyBkaXN0cyA9IHRvY2x1c3QgJT4lIAojICAgICBzZWxlY3QoLWxhbmd1YWdlKSAlPiUgCiMgICAgIGRpc3QoKSAjIHPDsyBwYXJhIHBsb3RhciBzaWxob3VldGFzIGRlcG9pcwojIGttID0gdG9jbHVzdCAlPiUgCiMgICAgIHNlbGVjdCgtbGFuZ3VhZ2UpICU+JSAKIyAgICAga21lYW5zKGNlbnRlcnMgPSBuX2NsdXN0ZXJzLCBuc3RhcnQgPSAyMCkKIyBrbSAlPiUgCiMgICAgIGF1Z21lbnQodG9jbHVzdCkgJT4lIAojICAgICBnYXRoZXIoa2V5ID0gInZhcmnDoXZlbCIsIHZhbHVlID0gInZhbG9yIiwgLWxhbmd1YWdlLCAtLmNsdXN0ZXIpICU+JSAKIyAgICAgZ2dwbG90KGFlcyh4ID0gYHZhcmnDoXZlbGAsIHkgPSB2YWxvciwgZ3JvdXAgPSBsYW5ndWFnZSwgY29sb3VyID0gLmNsdXN0ZXIpKSArIAojICAgICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIAojICAgICBnZW9tX2xpbmUoYWxwaGEgPSAuNSkgKyAKIyAgICAgZmFjZXRfd3JhcCh+IC5jbHVzdGVyKSAKYGBgCgpgYGB7cn0KbGlicmFyeShHR2FsbHkpCmRhdGEoY3JhYnMsIHBhY2thZ2UgPSAiTUFTUyIpCmdncGFyY29vcmQoY3JhYnMsIGNvbHVtbnMgPSA0OjgsIGdyb3VwQ29sdW1uID0gInNwIikKYGBgCgpgYGB7cn0KbGlicmFyeShHR2FsbHkpCgpnZ3BhcmNvb3JkKHNjYWxlZF9kYXRhKQpsaWJyYXJ5KGxhdHRpY2UpCnBhcmFsbGVscGxvdChzY2FsZWRfZGF0YSkKYGBgCgpgYGB7cn0Kc2NhbGVkX2RhdGEgJT4lCiAgICBrbWVhbnMoMywgbnN0YXJ0PTEwMCkgLT4ga20KCnAgPC0gYXV0b3Bsb3Qoa20sIGRhdGE9c2NhbGVkX2RhdGEsIGZyYW1lID0gVFJVRSkgIAoKZ2dwbG90bHkocCkKCmBgYAoKYGBge3J9Cm5fY2x1c3RlcnMgPSAzCgpyb3cubmFtZXMoc2NhbGVkX2RhdGEpIDwtIGRhdGEkdGl0bGUKCnRvY2x1c3QgPC0gc2NhbGVkX2RhdGEgJT4lIAogICAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJ0aXRsZSIpIAoKa20gPSB0b2NsdXN0ICU+JSAKICAgIHNlbGVjdCgtdGl0bGUpICU+JSAKICAgIGttZWFucyhjZW50ZXJzID0gbl9jbHVzdGVycywgbnN0YXJ0ID0gMjApCgprbSAlPiUgCiAgICBhdWdtZW50KHRvY2x1c3QpICU+JSAKICAgIGdhdGhlcihrZXkgPSAidmFyacOhdmVsIiwgdmFsdWUgPSAidmFsb3IiLCAtdGl0bGUsIC0uY2x1c3RlcikgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gYHZhcmnDoXZlbGAsIHkgPSB2YWxvciwgZ3JvdXAgPSB0aXRsZSwgY29sb3VyID0gLmNsdXN0ZXIpKSArIAogICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyAKICAgIGdlb21fbGluZShhbHBoYSA9IC41KSArIAogICAgZmFjZXRfd3JhcCh+IC5jbHVzdGVyKSArCiAgICBjb29yZF9mbGlwKCkKCmBgYAoK